
/********************************************************************
 *  Simulador uRISC             Google-PRIG   TP1                   
 * 																    
 *   Grupo:    Carlos Bentes                                        
 *             Fernando Henrique  
 * 
 *                                        03/04/2008  
 ********************************************************************/

#include <iostream>
#include <fstream>
#include <sstream>

#include "TpGrafico.h"
#include "uRISC_Beta.h"

using namespace std;

void printInfo(void){
	cout << endl;
	cout <<  "-----------------------------------------------------\n";
	cout <<  "-   Simulador uRISC             Google-PRIG   TP1   -\n";
	cout <<  "-   Grupo:    Carlos Bentes                         -\n";
	cout <<  "-             Fernando Henrique                     -\n";
	cout <<  "-                                       03/04/2008  -\n";
	cout <<  "-----------------------------------------------------\n";
	cout << endl;
	cout << "TP1_uRISC <arq_entrada> [-d <pos_inicial> <numero_palavras>] [-s]" << endl;
	cout << endl;
}


int main(int argc, char *argv[]) {

	ifstream inFile;
	bool listaMem = false;
	bool dTpGrafico = false;
	u16bits posMemInit = 0;
	u16bits nMemPalavras = 0;
	string nomeProg;
	
	//Trata Argumentos
	if( argc < 2){
		printInfo();
		return 1;
	}else{
		
		nomeProg = argv[1];
		
		for(int i=2; i<argc; i++){
			string _temp;
			_temp = argv[i]; 
			if( _temp == "-d"){
				listaMem = true;
				if( (i+2) < argc){  // verifica limite
					stringstream(argv[i+1]) >> hex >> posMemInit;
					stringstream(argv[i+2]) >> hex >> nMemPalavras;
				}else{
					printInfo();
					return 1;
				}
			}
			else if( _temp == "-s") dTpGrafico = true;
		}
	}
	
	inFile.open(nomeProg.c_str());
	if(inFile == NULL){
		cout << "Arquivo: " << nomeProg << " nao encontrado. " << endl;
		return 1;
	}

	uRISC_Beta uCPU(inFile);  //cria objeto uRISC
	
	if(dTpGrafico){
	
		TpGrafico tela;
		tela.init();
		//constroe padrao da memoria
		for(unsigned int i=0; i<65536; i++){
			stringstream ss;
			ss << "0x" << hex << i << " : 0x" << hex << uCPU.getMemRAM(i);
			tela.setVROMPushBack(ss.str());	
		}
		tela.tpTela();
		tela.comandos();
		tela.event(uCPU);  //gera graficos de uCPU
	}
	else while(1){              //executa programa completo
			uCPU.ciclo_IF();
			uCPU.ciclo_ID();
			uCPU.ciclo_ExMem();
			uCPU.ciclo_WB();
			if( uCPU.getRegIR() == 0x2fff ) break;  // HALT
		}

	if(listaMem)
	for(u16bits i=posMemInit; i< posMemInit+nMemPalavras; i++){
		cout << "memRAM["<< hex << i << "] = 0x" << hex << uCPU.getMemRAM(i) << endl;
	}
		
	inFile.close();
	return 0;
}

